package com.ruoyi.driver.controller;

import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.driver.service.FaceRecognitionService;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 人脸识别控制器
 * 处理司机人脸识别相关的HTTP请求
 */
@RestController
@RequestMapping("/driverUser/face")
public class FaceRecognitionController extends BaseController {
    
    @Autowired
    private FaceRecognitionService faceRecognitionService;
    
    /**
     * 获取百度云API的访问Token
     * 用于调试和测试
     * @return Token信息
     */
    @GetMapping("/getToken")
    public AjaxResult getAuthToken() {
        try {
            String token = faceRecognitionService.getAuthToken();
            if (token != null) {
                return AjaxResult.success("获取Token成功", token);
            } else {
                return AjaxResult.error("获取Token失败");
            }
        } catch (Exception e) {
            logger.error("获取Token异常", e);
            return AjaxResult.error("系统异常，请重试");
        }
    }
    

    
    /**
     * 上传人脸图片进行识别
     */
    @PostMapping("/recognize")
    public AjaxResult recognize(@RequestParam("file") MultipartFile file) {
        try {
            if (file == null || file.isEmpty()) {
                return AjaxResult.error("人脸图片不能为空");
            }
            
            byte[] bytes = file.getBytes();
            String imageBase64 = Base64.getEncoder().encodeToString(bytes);

            Map<String, Object> result = faceRecognitionService.recognizeFace(imageBase64);
            if ((boolean) result.getOrDefault("success", false)) {
                return AjaxResult.success("识别成功", result);
            }
            return AjaxResult.error(result.getOrDefault("message", "识别失败").toString());
        } catch (IOException e) {
            logger.error("图片处理异常", e);
            return AjaxResult.error("图片处理失败，请重试");
        } catch (Exception e) {
            logger.error("人脸识别异常", e);
            return AjaxResult.error("系统异常，请重试");
        }
    }
    

    
    /**
     * 人脸注册接口
     * 将司机人脸注册到百度云人脸库中
     * @param file 人脸图片文件
     * @param userId 用户ID，在本系统中使用司机ID
     * @param userName 用户名，在本系统中使用司机姓名
     * @return 注册结果
     */
    @PostMapping("/register")
    public AjaxResult faceRegister(
            @RequestParam("file") MultipartFile file,
            @RequestParam("userId") String userId,
            @RequestParam("userName") String userName) {
        try {
            // 参数校验
            if (file == null || file.isEmpty()) {
                return AjaxResult.error("人脸图片不能为空");
            }
            if (userId == null || userId.isEmpty()) {
                return AjaxResult.error("司机ID不能为空");
            }
            if (userName == null || userName.isEmpty()) {
                return AjaxResult.error("司机姓名不能为空");
            }
            
            // 将图片文件转换为Base64编码
            byte[] bytes = file.getBytes();
            String imageBase64 = Base64.getEncoder().encodeToString(bytes);
            
            Map<String, Object> result = faceRecognitionService.faceRegister(imageBase64, userId, userName);
            if ((Boolean) result.get("success")) {
                return AjaxResult.success((String) result.get("message"), result);
            } else {
                return AjaxResult.error((String) result.get("message"));
            }
        } catch (IOException e) {
            logger.error("图片处理异常", e);
            return AjaxResult.error("图片处理失败，请重试");
        } catch (Exception e) {
            logger.error("人脸注册异常", e);
            return AjaxResult.error("系统异常，请重试");
        }
    }

    /**
     * 人脸检测接口
     * 检测图片中的人脸是否清晰、是否符合要求
     * @param file 人脸图片文件
     * @return 检测结果
     */
    @PostMapping("/detect")
    public AjaxResult faceDetect(@RequestParam("file") MultipartFile file) {
        try {
            // 参数校验
            if (file == null || file.isEmpty()) {
                return AjaxResult.error("人脸图片不能为空");
            }
            
            // 将图片文件转换为Base64编码
            byte[] bytes = file.getBytes();
            String imageBase64 = Base64.getEncoder().encodeToString(bytes);
            
            JSONObject result = faceRecognitionService.faceDetect(imageBase64);
            if (result.has("error")) {
                return AjaxResult.error(result.getString("error"));
            }
            if (result.has("error_code") && result.getInt("error_code") == 0) {
                // 将JSONObject递归转换为Map，确保所有嵌套的JSON对象都能被正确序列化
                JSONObject resultObj = result.getJSONObject("result");
                Object convertedResult = convertJsonToObject(resultObj);
                return AjaxResult.success("检测成功", convertedResult);
            }
            return AjaxResult.error(result.optString("error_msg", "检测失败"));
        } catch (IOException e) {
            logger.error("图片处理异常", e);
            return AjaxResult.error("图片处理失败，请重试");
        } catch (Exception e) {
            logger.error("人脸检测异常", e);
            return AjaxResult.error("系统异常，请重试");
        }
    }
    
    /**
     * 递归将JSONObject或JSONArray转换为Java对象
     * @param jsonObj 要转换的JSON对象
     * @return 转换后的Java对象
     */
    private Object convertJsonToObject(Object jsonObj) {
        if (jsonObj == null) {
            return null;
        }
        
        if (jsonObj instanceof JSONObject) {
            JSONObject jsonObject = (JSONObject) jsonObj;
            Map<String, Object> map = new HashMap<>();
            for (String key : jsonObject.keySet()) {
                map.put(key, convertJsonToObject(jsonObject.get(key)));
            }
            return map;
        } else if (jsonObj instanceof JSONArray) {
            JSONArray jsonArray = (JSONArray) jsonObj;
            List<Object> list = new ArrayList<>();
            for (int i = 0; i < jsonArray.length(); i++) {
                list.add(convertJsonToObject(jsonArray.get(i)));
            }
            return list;
        } else {
            // 基本类型直接返回
            return jsonObj;
        }
    }
}
